package c04.biasedlock;

import lombok.extern.slf4j.Slf4j;
import org.openjdk.jol.info.ClassLayout;

@Slf4j(topic = "c.BiasedRevoke")
public class BiasedRevoke {
    static class Dog {

    }

    public static void main(String[] args) throws InterruptedException {
        Dog d = new Dog();
        Thread t1 = new Thread(() -> {
            synchronized (d) {
                log.debug(ClassLayout.parseInstance(d).toPrintable());
            }

            synchronized (BiasedRevoke.class) {
                BiasedRevoke.class.notify();
            }

            // 如果不用 wait/notify 使用 join 必须打开下面的注释
            // 因为:t1 线程不能结束,否则底层线程可能被 jvm 重用作为 t2 线程,底层线程 id 是一样的
//            try {
//                System.in.read();
//            } catch (IOException e) {
//                e.printStackTrace();
//            }
        }, "t1");

        t1.start();

        Thread t2 = new Thread(() -> {
            synchronized (BiasedRevoke.class) {
                try {
                    BiasedRevoke.class.wait();
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
            log.debug(ClassLayout.parseInstance(d).toPrintable());

            synchronized (d) {
                log.debug(ClassLayout.parseInstance(d).toPrintable());
            }
            log.debug(ClassLayout.parseInstance(d).toPrintable());
        }, "t2");

        t2.start();
    }
}
